package repositories

import (
	"qimo_work/config"
	"qimo_work/models"

	"log"
)

// CreatePost 创建文章
func CreatePost(post *models.Post) error {
	// 启动一个数据库事务
	tx := config.DB.Begin()

	// 确保事务在结束时正确提交或回滚
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
			log.Println("Transaction rolled back due to panic:", r)
		}
	}()

	// 插入文章数据
	if err := tx.Create(post).Error; err != nil {
		tx.Rollback() // 出错时回滚事务
		log.Println("Error creating post:", err)
		return err
	}

	// 提交事务
	if err := tx.Commit().Error; err != nil {
		log.Println("Error committing transaction:", err)
		return err
	}

	// 记录成功日志
	log.Println("Post created successfully, ID:", post.ID)

	return nil
}

// GetAllPosts 获取所有文章
// GetAllPosts 获取分页的文章列表
func GetAllPosts(page, pageSize int) ([]models.Post, int64, error) {
	var posts []models.Post
	var total int64

	// 获取文章总数
	if err := config.DB.Model(&models.Post{}).Count(&total).Error; err != nil {
		log.Println("Error counting posts:", err)
		return nil, 0, err
	}

	// 分页查询
	offset := (page - 1) * pageSize
	if err := config.DB.Limit(pageSize).Offset(offset).Find(&posts).Error; err != nil {
		log.Println("Error fetching posts:", err)
		return nil, 0, err
	}

	return posts, total, nil
}

// GetPostByID 根据ID获取文章
func GetPostByID(id uint) (models.Post, error) {
	var post models.Post

	// 根据ID查询文章
	if err := config.DB.First(&post, id).Error; err != nil {
		log.Println("Error fetching post by ID:", err)
		return post, err
	}

	return post, nil
}

// UpdatePost 更新文章
func UpdatePost(post models.Post) error {
	// 启动一个数据库事务
	tx := config.DB.Begin()

	// 确保事务在结束时正确提交或回滚
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
			log.Println("Transaction rolled back due to panic:", r)
		}
	}()

	// 更新文章数据
	if err := tx.Save(&post).Error; err != nil {
		tx.Rollback() // 出错时回滚事务
		log.Println("Error updating post:", err)
		return err
	}

	// 提交事务
	if err := tx.Commit().Error; err != nil {
		log.Println("Error committing transaction:", err)
		return err
	}

	// 记录成功日志
	log.Println("Post updated successfully:", post.ID)

	return nil
}

// DeletePost 删除文章
func DeletePost(id uint) error {
	// 启动一个数据库事务
	tx := config.DB.Begin()

	// 确保事务在结束时正确提交或回滚
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
			log.Println("Transaction rolled back due to panic:", r)
		}
	}()

	// 删除文章
	if err := tx.Delete(&models.Post{}, id).Error; err != nil {
		tx.Rollback() // 出错时回滚事务
		log.Println("Error deleting post:", err)
		return err
	}

	// 提交事务
	if err := tx.Commit().Error; err != nil {
		log.Println("Error committing transaction:", err)
		return err
	}

	// 记录成功日志
	log.Println("Post deleted successfully:", id)

	return nil
}

// GetPostsByCategory 根据分类 ID 获取指定数量的文章
func GetPostsByCategory(categoryID int, limit int) ([]models.Post, error) {
	tx := config.DB.Begin()
	var posts []models.Post
	// 查询该分类下的前 limit 条文章
	if err := tx.Where("category_id = ?", categoryID).Limit(limit).Find(&posts).Error; err != nil {
		return nil, err
	}
	return posts, nil
}

// GetPostsByCategory 根据分类 ID 获取指定数量的文章
func GetPostsByCategoryall(categoryID int, limit int) ([]models.Post, error) {
	tx := config.DB.Begin()
	var posts []models.Post

	// 如果 limit 为 0，查询所有文章
	query := tx.Where("category_id = ?", categoryID)
	if limit > 0 {
		query = query.Limit(limit)
	}

	// 查询该分类下的文章
	if err := query.Find(&posts).Error; err != nil {
		return nil, err
	}
	return posts, nil
}
